package com.raindrop.rd.util.file;

import java.io.*;
import java.net.URL;

/**
 * 文件工具类
 *
 * @author BillDowney
 * @date 2021/3/19 15:49
 */
public class FileUtil {

    /**
     * 获取classpath路径的前缀
     */
    public static final String CLASSPATH = "classpath:";
    /**
     * 读取文件内容每次的大小
     */
    public static final int READ_LENGTH = 2048;

    /**
     * <p>获取文件内容，以字符串的形势返回所有的内容，注意是否有OOM的风险，此方法不适用于读取大文件</p>
     * <p>如果返回了null则证明文件不存在</p>
     *
     * @param path 调用{@link FileUtil#getFile}方法去获取文件
     * @return null或者字符串
     * @throws IOException 文件不存在，读取文件错误
     */
    public static String readContent(String path) throws IOException {
        StringBuffer str = new StringBuffer();
        File file = getFile(path);
        try (FileReader fileReader = new FileReader(file);
             BufferedReader br = new BufferedReader(fileReader)) {
            int len;
            char[] buf = new char[READ_LENGTH];
            while ((len = br.read(buf)) != -1) {
                str.append(new String(buf, 0, len));
            }
        } catch (IOException e) {
            throw e;
        }
        return str.toString();
    }

    /**
     * <p>根据路径获取文件对象，可加{@link FileUtil#CLASSPATH}读取classpath中的文件</p>
     *
     * @param path 文件路径
     * @return null或文件对象
     */
    public static FileInfo getFile(String path) {
        FileInfo file = null;
        if (path.startsWith(CLASSPATH)) {
            URL url = FileUtil.class.getResource(path.replaceFirst(CLASSPATH, ""));
            file = url == null ? null : new FileInfo(url.getPath());
        } else {
            file = new FileInfo(path);
        }
        if (file == null || !file.exists()) {
            return null;
        }
        return file;
    }

}
